package org.radargun.logging; import java.io.File; import java.io.Serializable; import org.apache.logging.log4j.core.ErrorHandler; import org.apache.logging.log4j.core.Filter; import org.apache.logging.log4j.core.Layout; import org.apache.logging.log4j.core.LogEvent; import org.apache.logging.log4j.core.appender.RollingRandomAccessFileAppender; import org.apache.logging.log4j.core.appender.rolling.RolloverStrategy; import org.apache.logging.log4j.core.appender.rolling.TriggeringPolicy; import org.apache.logging.log4j.core.config.Configuration; import org.apache.logging.log4j.core.config.plugins.Plugin; import org.apache.logging.log4j.core.config.plugins.PluginAttribute; import org.apache.logging.log4j.core.config.plugins.PluginConfiguration; import org.apache.logging.log4j.core.config.plugins.PluginElement; import org.apache.logging.log4j.core.config.plugins.PluginFactory; /** * Apends an node instance identifier at the end of the filename. * * @author Mircea Markus <Mircea.Markus@jboss.com> */ @Plugin(name = "PerNodeRollingRandomAccessFile", category = "Core", elementType = "appender", printObject = true) public final class PerNodeRollingRandomAccessFileAppender implements org.apache.logging.log4j.core.Appender { public static final String PROP_NAME = "log4j.file.prefix"; private final RollingRandomAccessFileAppender appender; private PerNodeRollingRandomAccessFileAppender(RollingRandomAccessFileAppender appender) { this.appender = appender; } @PluginFactory public static PerNodeRollingRandomAccessFileAppender createAppender( @PluginAttribute("fileName") final String fileName, @PluginAttribute("filePattern") final String filePattern, @PluginAttribute("append") final String append, @PluginAttribute("name") final String name, @PluginAttribute("immediateFlush") final String immediateFlush, @PluginAttribute("bufferSizeStr") final String bufferSizeStr, @PluginElement("Policy") final TriggeringPolicy policy, @PluginElement("Strategy") RolloverStrategy strategy, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter, @PluginAttribute("ignoreExceptions") final String ignore, @PluginAttribute("advertise") final String advertise, @PluginAttribute("advertiseURI") final String advertiseURI, @PluginConfiguration final Configuration config) { RollingRandomAccessFileAppender appender = RollingRandomAccessFileAppender.createAppender( appendNodeIndex(fileName), appendNodeIndex(filePattern), append, name, immediateFlush, bufferSizeStr, policy, strategy, layout, filter, ignore, advertise, advertiseURI, config); return new PerNodeRollingRandomAccessFileAppender(appender); } private static String appendNodeIndex(String s) { String prop = System.getProperty(PROP_NAME); if (prop != null) { System.out.println("PerNodeRollingFileAppender::Using file prefix:" + prop); int lastIndex = s.lastIndexOf(File.separator); if (lastIndex < 0) { return prop + "_" + s; } else { return s.substring(0, lastIndex + 1) + prop + s.substring(lastIndex + 1); } } else { System.out.println("PerNodeRollingFileAppender::Not using file prefix."); return s; } } @Override public void append(LogEvent event) { appender.append(event); } @Override public String getName() { return appender.getName(); } @Override public Layout<? extends Serializable> getLayout() { return appender.getLayout(); } @Override public boolean ignoreExceptions() { return appender.ignoreExceptions(); } @Override public ErrorHandler getHandler() { return appender.getHandler(); } @Override public void setHandler(ErrorHandler handler) { appender.setHandler(handler); } @Override public State getState() { return appender.getState(); } @Override public void start() { appender.start(); } @Override public void stop() { appender.stop(); } @Override public boolean isStarted() { return appender.isStarted(); } @Override public boolean isStopped() { return appender.isStopped(); } }